package com.orion.async;

import com.orion.util.SmallTool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;

import java.util.concurrent.Future;

/**
 * 异步任务，默认的线程池大小是8，必须加上@EnableAsync注解
 *
 * 调用别的bean的异步方法，这样才生效，不能调用自身的异步方法，否则不生效，这涉及spring的动态代理
 *
 * 必须注意，如果定义的线程池名字不是默认那个taskExecutor，而是别的，而在使用@Async注解时又没有指定线程池的名字，那就会使用
 * 系统默认的SimpleAsyncTaskExecutor，这个是来一个任务就创建一个线程，比较浪费资源。所以要使用自己的线程池，
 * 如果名字不是taskExecutor，那就在@Async指定自定义线程池名字，要么线程池使用默认名字taskExecutor，那么直接使用@Async，不用指定名字
 *
 * @author Administrator
 */
@Component
@ConditionalOnProperty(value = "async.asyncTaskWithCustomPool", havingValue = "true")
public class AsyncTaskWithCustomPool implements CommandLineRunner {

    @Autowired
    private OtherClazzWithAsyncTaskMethod otherClazzWithAsyncTaskMethod;

    @Override
    public void run(String... strings) throws Exception {
        SmallTool.printTimeAndThread("run async task in other class");
        Future<String> future = otherClazzWithAsyncTaskMethod.customFutureTaskByCustomPool();
        SmallTool.printTimeAndThread(
                "let get result form Clazz[OtherClazzWithAsyncTaskMethod]的异步方法customFutureTaskByCustomPool() : "
                + future.get());
    }
    /**
     * 自定义线程池的自定义前缀
     *
     1644743053182	|	1	|	main	|	run async task in other class
     1644743058187	|	1	|	main	|	let get result form Clazz[OtherClazzWithAsyncTaskMethod]的异步方法
                                            customFutureTaskByCustomPool() : do Task by thread ：llc-execute-1
     */
}
